﻿/*----------------------------------------------------------------
//  <copyright file="RoleBase.cs" company="MicroCloud@151504200868">
//      Copyright © 2020-2024 MicroCloud Corporation, All rights reserved.
//  </copyright>
//  <site>https://gitee.com/chenmm123/microclouds</site>
//  <last-editor>cmm</last-editor>
//  <last-date>2023-12-06 18:29</last-date>
//----------------------------------------------------------------*/

namespace MicroCloud.Identity.Entities
{
    #region "角色信息基类"
    /// <summary>
    /// 角色信息基类
    /// </summary>
    /// <typeparam name="TKey">角色编号类型</typeparam>
    /// <typeparam name="TUserKey">用户编号类型</typeparam>
    public abstract class RoleBase<TKey, TUserKey> : EntityBase<TKey>, ILockable, ICreationAudited<TUserKey>, IUpdateAudited<TUserKey>, ISoftDeletable
        where TKey : struct, IEquatable<TKey>
        where TUserKey : struct, IEquatable<TUserKey>
    {
        #region "属性"
        #region "获取或设置 角色名称"
        private string _Name = "";
        /// <summary>
        /// 获取或设置 角色名称
        /// </summary>
        [Column("Name")]
        [Required, DefaultValue("")]
        [StringSize(StringSizeType.Name)]
        [DisplayName("角色名称")]
        public string Name { get { return _Name; } set { _Name = value.ReplaceNull(); } }
        #endregion
        #region "获取或设置 标准化名称"
        private string _NormalizedName = "";
        /// <summary>
        /// 获取或设置 标准化名称
        /// </summary>
        [Column("NormalizedName")]
        [Required, DefaultValue("")]
        [AuditIgnore]
        [StringSize(StringSizeType.Name)]
        [DisplayName("标准化名称")]
        public string NormalizedName { get { return _NormalizedName; } set { _NormalizedName = value.ReplaceNull(); } }
        #endregion

        #region "获取或设置 角色描述"
        private string _Description = "";
        /// <summary>
        /// 获取或设置 角色描述
        /// </summary>
        [Column("Description")]
        [StringSize(StringSizeType.Description)]
        [DisplayName("角色描述")]
        public string Description { get { return _Description; } set { _Description = value.ReplaceNull(); } }
        #endregion
        #region "获取或设置 备注"
        private string _Remark = "";
        /// <summary>
        /// 获取或设置 备注
        /// </summary>
        [Column("Remark")]
        [StringSize(StringSizeType.Remark)]
        [DisplayName("备注")]
        public string Remark { get { return _Remark; } set { _Remark = value.ReplaceNull(); } }
        #endregion

        #region "获取或设置 是否管理员角色"
        /// <summary>
        /// 获取或设置 是否管理员角色
        /// </summary>
        [Column("IsAdmin")]
        [DisplayName("是否管理员角色")]
        public bool IsAdmin { get; set; }
        #endregion
        #region "获取或设置 是否默认角色"
        /// <summary>
        /// 获取或设置 是否默认角色
        /// <para>用户注册后拥有此角色</para>
        /// </summary>
        [Column("IsDefault")]
        [DisplayName("是否默认角色")]
        public bool IsDefault { get; set; }
        #endregion
        #region "获取或设置 是否系统角色"
        /// <summary>
        /// 获取或设置 是否系统角色
        /// </summary>
        [Column("IsSystem")]
        [DisplayName("是否系统角色")]
        public bool IsSystem { get; set; }
        #endregion

        #region "获取或设置 是否锁定当前信息，ILockable 可装载接口，用于IEnumerable、IQueryable筛选"
        /// <summary>
        /// 获取或设置 是否锁定当前信息
        /// </summary>
        [Column("IsLocked")]
        [DisplayName("是否锁定")]
        public bool IsLocked { get; set; }
        #endregion

        #region "获取或设置 创建者编号 ICreationAudited 可装载接口，在数据创建时可自动设置当前用户值"
        /// <summary>
        /// 获取或设置 创建者编号
        /// </summary>
        [Column("CreatorId")]
        [DisplayName("创建者编号")]
        public TUserKey? CreatorId { get; set; }
        #endregion
        #region "获取或设置 创建时间 ICreatedTime、ICreationAudited  可装载接口，在数据创建时可自动设置当前时间"
        /// <summary>
        /// 获取或设置 创建时间
        /// </summary>
        [Column("CreatedTime")]
        [DisplayName("创建时间")]
        public DateTime CreatedTime { get; set; }
        #endregion

        #region "获取或设置 更新者编号 IUpdateAudited 可装载接口，在数据更新时可自动设置当前用户值"
        /// <summary>
        /// 获取或设置 更新者编号
        /// </summary>
        [DisplayName("更新者编号")]
        public TUserKey? UpdaterId { get; set; }
        #endregion
        #region "获取或设置 更新时间 IUpdatedTime、IUpdateAudited 可装载接口，在数据更新时可自动设置当前时间"
        /// <summary>
        /// 获取或设置 更新时间
        /// </summary>
        [DisplayName("更新时间")]
        public DateTime? UpdatedTime { get; set; }
        #endregion

        #region "获取或设置 数据逻辑删除时间 ISoftDeletable 可装载接口，用于数据逻辑删除功能。注：Configuration文件中注意配置索引并且在最后增加 .IsUnique().HasFilter(null);"
        /// <summary>
        /// 获取或设置 数据逻辑删除时间
        /// （为 null 时表示为正常数据，有值表示已逻辑删除，同时删除时间每次不同也能保证索引唯一性）
        /// </summary>
        [Column("DeletedTime")]
        [DisplayName("删除时间")]
        public DateTime? DeletedTime { get; set; }
        #endregion

        #endregion

        #region "构造函数"
        #region "初始化一个角色信息基类的新实例"
        /// <summary>
        /// 初始化一个角色信息基类 <see cref="RoleBase{TRoleKey, TUserKey}"/> 的新实例
        /// </summary>
        protected RoleBase()
        { }
        #endregion

        #endregion

        #region "方法"
        #region "返回表示当前对象的字符串"
        /// <summary>
        /// 返回表示当前对象的字符串
        /// </summary>
        /// <returns>表示当前对象的字符串</returns>
        public override string ToString()
        {
            return Name;
        }
        #endregion

        #endregion

    }
    #endregion

}
